package com.pmc.prototipo.services;

import com.pmc.prototipo.entities.Usuario;
import com.pmc.prototipo.entities.ValueEntropia;
import com.pmc.prototipo.excepciones.InvalidOperationException;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;

/**
 * Implementación de los servicios de persistencia que se le prestan al sistema.
 * @author Camilo Alvarez
 */
@Stateless
public class PersistenceServicesMock implements IPersistenceServices,IPersistenceServicesRemote {

    // -----------------------------------------------
    // Atributos
    // -----------------------------------------------
    /**
     * Objeto que almacena los datos en memoria principal. [Implementación temporal]
     */
    private static ArrayList<Usuario> sDataUsuarios;
    private static ArrayList<ValueEntropia> sDataEntropia;

    // -----------------------------------------------
    // Constructor
    // -----------------------------------------------
    /**
     * Constructor de la clase. Inicializa los atributos.
     */
    public PersistenceServicesMock() {
        if (sDataUsuarios == null) {
            sDataUsuarios=new ArrayList<Usuario>();
            sDataEntropia=new ArrayList<ValueEntropia>();
            Usuario user = new Usuario();
            user.setUsuario("PACIENTE");
            user.setDocumento("15753");
            user.setNombreCompleto("Paciente");
            user.setPwd("");
            sDataUsuarios.add(user);
            user = new Usuario();
            user.setUsuario("ADMIN");
            user.setDocumento("15753");
            user.setNombreCompleto("1337 Admin");
            user.setPwd("");
            sDataUsuarios.add(user);
            user = new Usuario();
            user.setUsuario("DOCTOR");
            user.setDocumento("15753");
            user.setNombreCompleto("Doctor Haus");
            user.setPwd("");
            sDataUsuarios.add(user);
        }

    }

    // -----------------------------------------------
    // Métodos
    // -----------------------------------------------
    /**
     * Permite crear un objeto dentro de la persistencia del sistema.
     * @param obj. Objeto que representa la instancia de la entidad que se quiere crear.
     */
    public void create(Object obj)throws InvalidOperationException{
       if (obj instanceof Usuario){
            Usuario m = (Usuario) obj;
            for(Usuario us:sDataUsuarios){
                if(us.getUsuario().equals(m.getUsuario()))throw new InvalidOperationException("El usuario '"+m.getUsuario()+"' ya ha sido registrado en el sistema");
                if(us.getDocumento().equals(m.getDocumento()))throw new InvalidOperationException("El usuario con documento '"+m.getDocumento()+"' ya ha sido registrado en el sistema");
            }
            sDataUsuarios.add(m);
        }
       if (obj instanceof ValueEntropia){
            ValueEntropia m = (ValueEntropia) obj;
            sDataEntropia.add(m);
        }
    }

    /**
     * Permite modificar un objeto dentro de la persistencia del sistema.
     * @param obj. Objeto que representa la instancia de la entidad que se quiere modificar.
     */
    public void update(Object obj) {
        if (obj instanceof Usuario) {
            sDataUsuarios.set(sDataUsuarios.indexOf(obj), (Usuario) obj);
        }
        if (obj instanceof Usuario) {
            sDataEntropia.set(sDataEntropia.indexOf(obj), (ValueEntropia) obj);
        }
    }

    /**
     * Permite borrar un objeto dentro de la persistencia del sistema.
     * @param obj. Objeto que representa la instancia de la entidad que se quiere borrar.
     */
    public void delete(Object obj)throws InvalidOperationException{
        if (obj instanceof Usuario){
            Usuario usuarioABorrar = (Usuario) obj;
//            for(RegistroVenta rv : sDataRegistrosVentas){
//                if(rv.getComprador().getUsuario().equals(usuarioABorrar.getUsuario())){
//                    System.out.print("no borrado");
//                    throw new InvalidOperationException("El usuario ha realizado comprar y por lo tanto no puede ser eliminado del sistema.");
//                }
//            }
            if (usuarioABorrar != null && usuarioABorrar.getUsuario() != null) {
                for (int e = 0; e < sDataUsuarios.size(); e++) {
                    Usuario ven = (Usuario) sDataUsuarios.get(e);
                    if (ven.getUsuario().equals(usuarioABorrar.getUsuario())) {
                        sDataUsuarios.remove(e);
                        System.out.print("borrado");
                        break;
                    }
                }
            }
        }
        //System.out.println(obj.getClass());
    }

    /**
     * Retorna la lista de todos los elementos de una clase dada que se encuentran en el sistema.
     * @param c. Clase cuyos objetos quieren encontrarse en el sistema.
     * @return list. Listado de todos los objetos de una clase dada que se encuentran en el sistema.
     */
    public List findAll(Class c) {
        if (c.equals(Usuario.class)) {
            return sDataUsuarios;
        }else if (c.equals(ValueEntropia.class)) {
            return sDataEntropia;
        }else {
            return null;
        }

    }

    /**
     * Retorna la instancia de una entidad dado un identificador y la clase de la entidadi.
     * @param c. Clase de la instancia que se quiere buscar.
     * @param id. Identificador unico del objeto.
     * @return obj. Resultado de la consulta.
     */
    public Object findById(Class c, Object id) {
        if (c.equals(Usuario.class)) {
            for (Object v : findAll(c)) {
                Usuario mue = (Usuario) v;
                if (mue.getUsuario().equals(id)) {
                    return mue;
                }
            }
        }
        return null;
    }
}